STM32之CAN通讯接收过滤器过滤分析

您所在的位置:网站首页 stm32 can接收 STM32之CAN通讯接收过滤器过滤分析

STM32之CAN通讯接收过滤器过滤分析

2023-05-07 20:57| 来源: 网络整理| 查看: 265

一、前言

学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有标识符的协议。如下图所示的CAN通讯发送数据的数据帧,Arbitration Field即是具有优先级的标识ID,Data Field即是要发送的数据,Arbitration Field、Data Field就是我们关注的重点,因为CAN通讯协议里边这些发送出来的标识ID并不代表节点的地址,数据是以广播形式发送出来,每个节点都是可以接收,至于接收到的数据是不是想要的?就需要对这些标识的ID进行筛选和过滤,再去提取数据。

二、CAN 通讯接收过滤器的分析

首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。

typedef struct { uint32_t StdId; //11位 标准帧ID即Arbitration Field uint32_t ExtId; //29位 扩展帧ID uint8_t IDE; //1位 O:标准帧,1:扩展帧 uint8_t RTR; //1位 0:数据帧,1:远程帧 uint8_t DLC; //4位 发送的数据的长度 uint8_t Data[8]; //8位 发送的数据即Data Field } CanTxMsg;

因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMx,FSCx的设置,如下图所示: 看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识IDCanTxMsg.StdId是0x000~0x00f,接收过滤先用标识符屏蔽模式来过滤标识的ID,如下所示:

ID : 000 0000 0000 xxxx 屏蔽 : 111 1111 1111 0000

x代表0或者1都是可以通过,0000到1111的任意组合,这样就可以过滤出0x000~0x00f的数据的,所以屏蔽的意思就是让某个范围的标识符ID可以通过,目的是过滤出一组标志符。那么如果想过滤出一个数据0x003,用标识符屏蔽模式实现方式如下,

ID : 000 0000 0000 0011 屏蔽 : 111 1111 1111 1111

如果接收过滤使用标识符列表模式来过滤标识ID,如下所示,

ID : 000 0000 0001 ID : 000 0000 0010

这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID后跟发送过来的CanTxMsg.StdId进行校对,如果是则去接收数据,不是则过滤掉数据,标识符列表模式目的是过滤出一个标志符ID。

三、CAN 接收过滤器的四种工作模式的程序配置 1、32位标识符屏蔽模式

假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f

ID : 0000 001x xxx0 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位 屏蔽 : 1111 1110 0001 1111 1111 1111 1111 1111 //分别对应CAN_FxR2高16位、CAN_FxR2低16位

程序配置如下:

CAN_RxFilerconfig(0,CANRX32IDMASK); //32位标识符屏蔽模式 void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode) { CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选 if(FilterMode==CANRX32IDMASK) { CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 } else if(FilterMode==CANRX32IDLIST) { CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 } else if(FilterMode==CANRX16IDMASK) { CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 } else if(FilterMode==CANRX16IDLIST) { CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 } //标识符寄存器FxR1 CAN_FilterInitStructure.CAN_FilterIdHigh=0x010


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3